home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Libraries / GUSI 1.4.1 / GUSI / Examples / GUSIPPCTest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-25  |  3.6 KB  |  177 lines  |  [TEXT/MPS ]

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIPPCTest        -    Test PPC sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Language    :    MPW C
  6.  
  7. $Log: GUSIPPCTest.c,v $
  8. Revision 1.1  1994/02/25  02:47:36  neeri
  9. Initial revision
  10.  
  11. Revision 0.3  1993/06/20  00:00:00  neeri
  12. New sa_constr
  13.  
  14. Revision 0.2  1992/10/14  00:00:00  neeri
  15. Fix NBP type, usage messages
  16.  
  17. Revision 0.1  1992/09/08  00:00:00  neeri
  18. Factor out common socket routines
  19.  
  20. *********************************************************************/
  21.  
  22. #include <GUSI.h>
  23. #include <GUSITest.h>
  24. #include <stdio.h>
  25. #include <fcntl.h>
  26. #include <stdlib.h>
  27. #include <errno.h>
  28. #include <string.h>
  29.  
  30. #include <Events.h>
  31. #include <TextUtils.h>
  32.  
  33. extern int GUSIDefaultSpin(spin_msg, long);
  34.  
  35. sa_constr_ppc    Constr    =    {
  36.     PPC_CON_NEWSTYLE+PPC_CON_MATCH_TYPE,
  37.     "\p",
  38.     {
  39.         smRoman,
  40.         "\p",
  41.         ppcByString,
  42.         "\pGUSIPPCTest"
  43.     }
  44. };
  45.  
  46. void Socket(char, char, const char *)
  47. {
  48.     sock    =    socket(AF_PPC, SOCK_STREAM, 0);
  49.     
  50.     if (sock == -1)    {
  51.         printf("# socket() returned error %s\n", Explain());
  52.         Where();
  53.     }
  54. }
  55.  
  56. void Bind(char ch1, char ch2, const char * cmd)
  57. {
  58.     struct sockaddr_ppc    addr;
  59.  
  60.     if (sock == -1)    {
  61.         printf("# socket is not open\n");
  62.         Where();
  63.         
  64.         return;
  65.     }
  66.  
  67.     addr.family    =    AF_PPC;
  68.     addr.port.nameScript                        =    smRoman;
  69.     addr.port.portKindSelector                =    ppcByString;
  70.     addr.location.locationKindSelector    =    ppcNBPTypeLocation;
  71.     
  72.     if (sscanf(cmd, "%P %P", addr.port.name, &addr.location.u.nbpType) != 2) {
  73.         Usage(ch1, ch2);
  74.             
  75.         return;
  76.     }
  77.             
  78.     strcpy((char *) &addr.port.u.portTypeStr, (char *) "\pGUSIPPCTest");
  79.  
  80.     if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc)))    {
  81.         printf("bind() returned error %s\n", Explain());
  82.         Where();
  83.     }
  84. }
  85.  
  86. void Accept(char, char, const char *)
  87. {
  88.     int                        len;
  89.     struct sockaddr_ppc    addr;
  90.  
  91.     if (sock == -1)    {
  92.         printf("# socket is not open\n");
  93.         Where();
  94.         
  95.         return;
  96.     }
  97.     if (accsock != -1)    {
  98.         printf("# can't accept more than one connection\n");
  99.         Where();
  100.         
  101.         return;
  102.     }
  103.  
  104.     len    =    sizeof(struct sockaddr_ppc);
  105.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  106.     
  107.     if (sock < 0)    {
  108.         printf("# accept() returned error %s\n", Explain());
  109.         sock        =    accsock;
  110.         accsock    =    -1;
  111.     } else {
  112.         printf(
  113.             "# accepted connection from %P[%P]", 
  114.             addr.port.name, 
  115.             addr.port.u.portTypeStr);
  116.         
  117.         switch (addr.location.locationKindSelector) {
  118.         case ppcNBPLocation:
  119.             printf(
  120.                 "@%P:%P:%P\n", 
  121.                 addr.location.u.nbpEntity.objStr, 
  122.                 addr.location.u.nbpEntity.typeStr, 
  123.                 addr.location.u.nbpEntity.zoneStr);
  124.             break;
  125.         case ppcNBPTypeLocation:
  126.             printf("@%P\n", addr.location.u.nbpType);
  127.             break;
  128.         default:
  129.             printf("\n");
  130.             break;
  131.         }
  132.     }
  133.     
  134.     Where();
  135. }
  136.     
  137. void Connect(char, char, const char * cmd)
  138. {
  139.     int                        len;
  140.     struct sockaddr_ppc    addr;
  141.  
  142.     if (sock == -1)    {
  143.         printf("# socket is not open\n");
  144.         Where();
  145.         
  146.         return;
  147.     }
  148.     
  149.     len = sizeof(struct sockaddr_ppc);
  150.         
  151.     if (choose(AF_PPC, 0, "Yeah ?", &Constr, 0, &addr, &len))    {
  152.         printf("# choose() returned error %s\n", Explain());
  153.         Where();
  154.             
  155.         return;
  156.     }
  157.     if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc)))    {
  158.         printf("# connect() returned error %s\n", Explain());
  159.         Where();
  160.     }
  161. }    
  162.  
  163. main(int argc, char ** argv)
  164. {
  165.     printf("GUSIPPCTest        MN 20Jun93\n\n");
  166.  
  167.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  168.     COMMAND('b', 'd', Bind,      "Name Type",     "Bind to address");
  169.     COMMAND('c', 'o', Connect, "",                 "Connect to address");
  170.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  171.     
  172.     AddSocketCommands();
  173.     
  174.     GUSISetEvents(GUSISIOWEvents);
  175.     RunTest(argc, argv);
  176.     CleanupSockets();
  177. }